const asserts= require('assert')
function deepClone(obj, hash = new WeakMap()) {
    if (obj === null || typeof obj !== 'object') return obj

    // Date、Regex、Function 都是对象，不会严格相等，所以需要特殊处理
    if (obj instanceof Date) return new Date(obj)
    if (obj instanceof RegExp) return new RegExp(obj)
    if (typeof obj === 'function') return obj
    if (hash.has(obj)) return hash.get(obj)

    const cloneObj = Array.isArray(obj) ? [] : {}
    hash.set(obj, cloneObj)


    for (let key in obj) {
        if (obj.hasOwnProperty(key)) {
            cloneObj[key] = deepClone(obj[key], hash)
        }
    }

    return cloneObj
}


const obj = {
    a: 1,
    b: {
        c: 2,
        d: 3
    },
    e: [1, 2, 3],
    f: function () {
        console.log('hello')
    },
    g: new Date(),
    h: new RegExp('abc'),
    i: null,
    j: undefined,
}

const  b = deepClone(obj)
console.log(b);

asserts(obj.age , b.age) // false


// 基本数据类型
// null undefined boolean number string Symbol BigInt    
// 复杂数据类型
// Object function Regex Date Array Set Map Symbol
